home *** CD-ROM | disk | FTP | other *** search
/ Power CD / Power CD ATARI-Rechner Lieben.iso / ALLERLEI / GOBJ_112 / UNITS / OSTDWNDS.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1994-04-13  |  10.0 KB  |  388 lines

  1. {**************************************
  2.  *  O b j e c t G E M   Version 1.12  *
  3.  *  Copyright 1992-94 by Thomas Much  *
  4.  **************************************
  5.  *       Unit  O S T D W N D S        *
  6.  **************************************
  7.  *    Softdesign Computer Software    *
  8.  *    Thomas Much, Gerwigstraße 46,   *
  9.  *  76131 Karlsruhe, (0721) 62 28 41  *
  10.  *         Thomas Much @ KA2          *
  11.  *  UK48@ibm3090.rz.uni-karlsruhe.de  *
  12.  **************************************
  13.  *    erstellt am:        03.03.1994  *
  14.  *    letztes Update am:  13.04.1994  *
  15.  **************************************}
  16.  
  17. {
  18.   WICHTIGE ANMERKUNGEN ZUM QUELLTEXT:
  19.  
  20.   ObjectGEM wird ab sofort mit dem _vollständigen_ Quelltext ausgeliefert,
  21.   d.h. jeder kann sich die Unit selbst compilieren, womit die extrem
  22.   lästigen Kompatibilitätsprobleme mit den PP-Releases beseitigt sind.
  23.   ObjectGEM ist und bleibt aber trotzdem SHAREWARE, d.h. wer die Biblio-
  24.   thek regelmäßig benutzt, muß sich REGISTRIEREN lassen (so wie bisher).
  25.   Im Moment gibt es dafür dann "nur" die neueste Version; eine geTEXte
  26.   Doku ist aber in Arbeit, so daß auch ein gedrucktes Handbuch immer
  27.   wahrscheinlicher wird.
  28.  
  29.   Der Quelltext enthält z.Z. noch _keine_ Kommentare; wer sich dennoch die
  30.   Mühe macht, ihn zu lesen, wird feststellen, daß er außerdem noch recht
  31.   "wirr" und teilweise umständlich geschrieben ist, oder daß er evtl. auch
  32.   unnötige Teile enthält. Das liegt daran, daß dieser Quelltext eigentlich
  33.   gar nicht für eine Veröffentlichung gedacht war, aber immer häufiger auf-
  34.   tretende PP-Updates haben mich schier zur Verzweiflung getrieben...
  35.   Das alles sollte aber kein Grund sein, ObjectGEM nicht einzusetzen, denn
  36.   sobald nach "außen" die von mir gewünschte Funktionalität erreicht ist
  37.   (d.h. wenn alle wichtigen Objekte vorhanden sind, z.B. TEditWindow etc.),
  38.   werde ich mich um die "innere" Optimierung kümmern (dazu gehören dann
  39.   auch die Kommentare). Die bisher geschriebenen ObjectGEM-Anwendungen
  40.   können dann natürlich weiterverwendet werden.
  41.  
  42.   Wer beim Durchstöbern des Textes auf vermeintliche Fehler oder verbesse-
  43.   rungswürdige Stellen trifft (von letzterem gibt es sicherlich noch viele),
  44.   kann mir dies gerne mitteilen - ich habe auch ich nichts gegen kostenlos
  45.   zur Verfügung gestellte optimierte Routinen (sofern sich jemand die Mühe
  46.   macht). Wer in anderen Projekten, die nicht in direkter Konkurrenz zu
  47.   ObjectGEM stehen, einzelne Routinen verwenden möchte, wendet sich bitte
  48.   an mich (ein solcher Austausch sollte kein Problem sein).
  49.  
  50.   Wer sich auf nicht dokumentierte "implementation"- oder "private"-Eigen-
  51.   schaften verläßt, darf sich nicht über Inkompatibilitäten zu späteren
  52.   Versionen wundern; wer meint, eine Dokumentationslücke entdeckt zu haben
  53.   (außer dem "Abgrund" des noch fehlenden Handbuchs...), kann mir dies
  54.   gerne mitteilen.
  55.  
  56.   WICHTIG: Wer den Quelltext verändert und dann Probleme beim Compilieren,
  57.   Ausführen o.ä. hat, kann nicht damit rechnen, daß ich den Fehler suche;
  58.   tritt der Fehler allerdings auch mit dem Original-Quelltext auf, würde
  59.   ich mich über eine genaue Fehlerbeschreibung freuen. Veränderte Quell-
  60.   texte dürfen _nicht_ weitergegeben werden, dies wäre ein Verstoß gegen
  61.   das Copyright!
  62.  
  63.   Kleine Info zum Schluß: Als "default tabsize" verwende ich 2. Wer drei
  64.   Punkte ("...") im Quelltext entdeckt, hat eine Stelle gefunden, an der
  65.   ich z.Z. arbeite ;-)
  66.  
  67.   "Möge die OOP mit Euch sein!"
  68. }
  69.  
  70.  
  71. {$IFDEF DEBUG}
  72.     {$B+,D+,G-,I-,L+,N-,P-,Q+,R+,S+,T-,V-,X+,Z+}
  73. {$ELSE}
  74.     {$B+,D-,G-,I-,L-,N-,P-,Q-,R-,S-,T-,V-,X+,Z+}
  75. {$ENDIF}
  76.  
  77. unit OStdWnds;
  78.  
  79. interface
  80.  
  81. uses
  82.  
  83.     Strings,Gem,Objects,OTypes,OProcs,OWindows;
  84.  
  85. type
  86.  
  87.     PTextWindow = ^TTextWindow;
  88.     TTextWindow = object(TWindow)
  89.         public
  90.         Lines   : PStrCollection;
  91.         FontID,
  92.         FontSize,
  93.         Color   : integer;
  94.         constructor Init(AParent: PWindow; ATitle: string; InitLines,ADelta: integer);
  95.         destructor Done; virtual;
  96.         function GetStyle: integer; virtual;
  97.         function GetScroller: PScroller; virtual;
  98.         function GetClassName: string; virtual;
  99.         procedure InitPaint; virtual;
  100.         procedure Paint(var PaintInfo: TPaintStruct); virtual;
  101.         procedure ExitPaint; virtual;
  102.         procedure WMClosed; virtual;
  103.         procedure AddLine(NewLine: string); virtual;
  104.         procedure InsertLine(Index: longint; NewLine: string); virtual;
  105.         procedure DeleteLine(LineNumber: integer); virtual;
  106.         function GetLine(LineNumber: integer): string; virtual;
  107.         function GetLineLength(LineNumber: integer): integer; virtual;
  108.         function GetNumLines: integer; virtual;
  109.         procedure SetFont(NewID,NewSize: integer); virtual;
  110.         procedure UpdateSubTitle; virtual;
  111.         private
  112.         attrib: ARRAY_10;
  113.         fcw,
  114.         fch,
  115.         tfx   : integer
  116.     end;
  117.  
  118.     PEditWindow = ^TEditWindow;
  119.     TEditWindow = object(TTextWindow)
  120.         public
  121.         { ... }
  122.         function GetClassName: string; virtual;
  123.     end;
  124.  
  125.     PFileWindow = ^TFileWindow;
  126.     TFileWindow = object(TEditWindow)
  127.         public
  128.         { ... }
  129.         function GetClassName: string; virtual;
  130.     end;
  131.  
  132.     PHelpWindow = ^THelpWindow;
  133.     THelpWindow = object(TFileWindow)
  134.         public
  135.         { ... }
  136.         function GetClassName: string; virtual;
  137.     end;
  138.  
  139.  
  140.  
  141. implementation
  142.  
  143.  
  144. { *** Objekt TTEXTWINDOW *** }
  145.  
  146. constructor TTextWindow.Init(AParent: PWindow; ATitle: string; InitLines,ADelta: integer);
  147.  
  148.     begin
  149.         if not(inherited Init(AParent,ATitle)) then fail;
  150.         if Scroller=nil then
  151.             begin
  152.                 inherited Done;
  153.                 fail
  154.             end;
  155.         new(Lines,Init(InitLines,ADelta));
  156.         if Lines=nil then
  157.             begin
  158.                 inherited Done;
  159.                 fail
  160.             end;
  161.         UpdateSubTitle
  162.     end;
  163.  
  164.  
  165. destructor TTextWindow.Done;
  166.  
  167.     begin
  168.         if Lines<>nil then dispose(Lines,Done);
  169.         inherited Done
  170.     end;
  171.  
  172.  
  173. function TTextWindow.GetStyle: integer;
  174.  
  175.     begin
  176.         GetStyle:=(inherited GetStyle and not(INFO)) or SLIDER
  177.     end;
  178.  
  179.  
  180. function TTextWindow.GetScroller: PScroller;
  181.     var dummy: string[33];
  182.  
  183.     begin
  184.         GetScroller:=new(PScroller,Init(@self,1,1,1,1));
  185.         if Scroller<>nil then SetFont(vqt_name(vdiHandle,1,dummy),10);
  186.         Color:=Black
  187.     end;
  188.  
  189.  
  190. function TTextWindow.GetClassName: string;
  191.  
  192.     begin
  193.         GetClassName:='TextWindow'
  194.     end;
  195.  
  196.  
  197. procedure TTextWindow.InitPaint;
  198.     var dummy: integer;
  199.  
  200.     begin
  201.         vqt_attributes(vdiHandle,attrib);
  202.         tfx:=GP.teffects;
  203.         gem.vst_font(vdiHandle,FontID);
  204.         gem.vst_point(vdiHandle,FontSize,dummy,dummy,dummy,dummy);
  205.         gem.vst_alignment(vdiHandle,TA_LEFT,TA_TOP,dummy,dummy);
  206.         gem.vst_color(vdiHandle,Color);
  207.         gem.vst_rotation(vdiHandle,0);
  208.         gem.vst_effects(vdiHandle,TF_NORMAL);
  209.         gem.vswr_mode(vdiHandle,MD_REPLACE)
  210.     end;
  211.  
  212.  
  213. procedure TTextWindow.Paint(var PaintInfo: TPaintStruct);
  214.     var q: longint;
  215.  
  216.     begin
  217.         if Lines^.Count>0 then
  218.             for q:=0 to pred(Lines^.Count) do
  219.                 v_gtext(vdiHandle,Scroller^.GetXOrg,Scroller^.GetYOrg+q*fch,StrPas(Lines^.At(q)))
  220.         { ... }
  221.     end;
  222.  
  223.  
  224. procedure TTextWindow.ExitPaint;
  225.     var dummy: integer;
  226.  
  227.     begin
  228.         gem.vst_font(vdiHandle,attrib[0]);
  229.         gem.vst_height(vdiHandle,attrib[7],dummy,dummy,dummy,dummy);
  230.         gem.vst_alignment(vdiHandle,attrib[3],attrib[4],dummy,dummy);
  231.         gem.vst_color(vdiHandle,attrib[1]);
  232.         gem.vst_rotation(vdiHandle,attrib[2]);
  233.          gem.vst_effects(vdiHandle,tfx);
  234.         gem.vswr_mode(vdiHandle,attrib[5])
  235.     end;
  236.  
  237.  
  238. procedure TTextWindow.WMClosed;
  239.  
  240.     begin
  241.         if CanClose then Destroy
  242.     end;
  243.  
  244.  
  245. procedure TTextWindow.AddLine(NewLine: string);
  246.     var xr: integer;
  247.  
  248.     begin
  249.         Lines^.AtInsert(Lines^.Count,ChrNew(NewLine));
  250.         { ... }
  251.         UpdateSubTitle;
  252.         if length(NewLine)>=Scroller^.XRange then xr:=length(NewLine)+1
  253.         else
  254.             xr:=Scroller^.XRange;
  255.         Scroller^.SetRange(xr,Scroller^.YRange+1);
  256.         Scroller^.ScrollTo(0,Lines^.Count);
  257.         ForceRedraw
  258.     end;
  259.  
  260.  
  261. procedure TTextWindow.InsertLine(Index: longint; NewLine: string);
  262.     var xr: integer;
  263.  
  264.     begin
  265.         if Index<0 then Index:=0;
  266.         if Index>Lines^.Count then Index:=Lines^.Count;
  267.         Lines^.AtInsert(Index,ChrNew(NewLine));
  268.         { ... }
  269.         UpdateSubTitle;
  270.         if length(NewLine)>=Scroller^.XRange then xr:=length(NewLine)+1
  271.         else
  272.             xr:=Scroller^.XRange;
  273.         Scroller^.SetRange(xr,Scroller^.YRange+1);
  274.         Scroller^.ScrollTo(0,Index);
  275.         ForceRedraw
  276.     end;
  277.  
  278.  
  279. procedure TTextWindow.DeleteLine(LineNumber: integer);
  280.  
  281.     begin
  282.         if (LineNumber>=0) and (LineNumber<Lines^.Count) then Lines^.AtFree(LineNumber);
  283.         { ... }
  284.         UpdateSubTitle;
  285.         Scroller^.SetRange(Scroller^.XRange,Scroller^.YRange-1);
  286.         ForceRedraw
  287.     end;
  288.  
  289.  
  290. function TTextWindow.GetLine(LineNumber: integer): string;
  291.     var p: PChar;
  292.  
  293.     begin
  294.         GetLine:='';
  295.         if (LineNumber>=0) and (LineNumber<Lines^.Count) then
  296.             begin
  297.                 p:=Lines^.At(LineNumber);
  298.                 if p<>nil then GetLine:=StrPas(p)
  299.             end
  300.     end;
  301.  
  302.  
  303. function TTextWindow.GetLineLength(LineNumber: integer): integer;
  304.  
  305.     begin
  306.         GetLineLength:=length(GetLine(LineNumber))
  307.     end;
  308.  
  309.  
  310. function TTextWindow.GetNumLines: integer;
  311.  
  312.     begin
  313.         GetNumLines:=Lines^.Count
  314.     end;
  315.  
  316.  
  317. procedure TTextWindow.SetFont(NewID,NewSize: integer);
  318.     var dummy: integer;
  319.         atrb : ARRAY_10;
  320.  
  321.     begin
  322.         vqt_attributes(vdiHandle,atrb);
  323.         FontID:=gem.vst_font(vdiHandle,NewID);
  324.         FontSize:=gem.vst_point(vdiHandle,NewSize,dummy,dummy,fcw,fch);
  325.         gem.vst_font(vdiHandle,atrb[0]);
  326.         gem.vst_height(vdiHandle,atrb[7],dummy,dummy,dummy,dummy);
  327.         Scroller^.SetUnits(fcw,fch)
  328.     end;
  329.  
  330.  
  331. procedure TTextWindow.UpdateSubTitle;
  332.     var n: longint;
  333.  
  334.     begin
  335.         n:=GetNumLines;
  336.         if Application^.Attr.Country in [FRG,SWG] then
  337.             begin
  338.                 if n=1 then SetSubTitle(' 1 Zeile')
  339.                 else
  340.                     SetSubTitle(' '+ltoa(n)+' Zeilen')
  341.             end
  342.         else
  343.             begin
  344.                 if n=1 then SetSubTitle(' 1 line')
  345.                 else
  346.                     SetSubTitle(' '+ltoa(n)+' lines')
  347.             end
  348.     end;
  349.  
  350. { *** TTEXTWINDOW *** }
  351.  
  352.  
  353.  
  354. { *** Objekt TEDITWINDOW *** }
  355.  
  356. function TEditWindow.GetClassName: string;
  357.  
  358.     begin
  359.         GetClassName:='EditWindow'
  360.     end;
  361.  
  362. { *** TEDITWINDOW *** }
  363.  
  364.  
  365.  
  366. { *** Objekt TEDITWINDOW *** }
  367.  
  368. function TFileWindow.GetClassName: string;
  369.  
  370.     begin
  371.         GetClassName:='FileWindow'
  372.     end;
  373.  
  374. { *** TEDITWINDOW *** }
  375.  
  376.  
  377.  
  378. { *** Objekt THELPWINDOW *** }
  379.  
  380. function THelpWindow.GetClassName: string;
  381.  
  382.     begin
  383.         GetClassName:='HelpWindow'
  384.     end;
  385.  
  386. { *** THELPWINDOW *** }
  387.  
  388. end.